package juc.day01;

/*
volitile    关键字:当多个线程进行操作共享数据时，可以保证内存中的数据可见
                   相较于synchronized是一种较为轻量级的同步策略

注意：
    1.volitile不具备互斥性
    2.volitile不能保证变量的原子性


内存可见性的问题是，当多个线程
操作共享数据时，彼此不可见
 */
public class TestVolatile {
    public static void main(String[] args) {
        ThreadDemo t = new ThreadDemo();
        new Thread(t).start();

        while (true) {
            //使用锁降低性能
//            synchronized (t){
//                if (t.isFlag()){
//                    System.out.println("----------------");
//                    break;
//                }
//            }
            if (t.isFlag()) {
                System.out.println("----------------");
                break;
            }
        }
    }
}

class ThreadDemo implements Runnable {
    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    //是变量可视化
    private volatile boolean flag = false;

    @Override
    public void run() {
        try {
            Thread.sleep(200);
        } catch (Exception e) {
            e.printStackTrace();
        }

        flag = true;
        System.out.println("flag:" + flag);
    }
}
